架构 | iOS组件化的一些思考

  • 背景: 需要开发一套能够通过模板快速生成下单使用的表单页面,提供给多个项目组

需求


一、设计思路

  • 整体以管理者模式,完成渲染、交互
  • 局部使用工厂模式、单例模式、代理模式、原型模式提供各个交互能力,包含:页面UI渲染,交互弹窗,业务选择等等能力

需求

二、需要的条件

  • ViewController壳子:
      承载页面,处理非公共的业务交互     
      各个项目组存在自身特有的业务属性以及交互,这部分需要自行处理
    
  • 表单管理者:
      处理页面渲染以及公共的基础交互、业务交互
    
  • 基础组件:
      网络NetWork、扩展分类、    常用工具等
    
  • 基础UI组件:
      地图选择、弹窗控制、下拉控制、导航控制、日期选择等
    
  • 公共业务组件:
      车型车长选择、保险选择、支付计划填写、联系人信息选择等
    
  • 三方库:
      AFNet、Masonry、BaiduMapKit、MBProgressHUD、SDWebImage、IQKeyboardManager、BeeHive
    

三、具体流程

需求

四、过程问题即思考

1. 旧版本无法渲染时的处理:

1. 表单数据(比如单行输入框)设置版本号
2. 本地表单组件保存最高支持版本号
3. 在渲染的时候遍历所有样式,存在超过本地存储的版本号,表示页面有无法渲染的内容,需要做出相应的处理
4. 处理:必填参数无法渲染,提示用户更新或者直接返回原下单页面;非必填参数可一定程度上忽略继续展示,用户将无感知填写表单页面

2. 通用业务和项目专用业务的划分:

1. 通用业务组件:公司内部各个中台能提供的能力组件,比如会员中心,各业务线和项目组用户数据落库等在同一个地方,那用户信息组件即可沉淀为通用的业务组件
2. 专用业务组件:业务线特殊需求的内容,不存在通用性,哪怕落库中台也不属于通用的组件
3. 原则上表单需要提供给各个业务线,项目组使用,那么所依赖的业务组件必须是通用的业务组件,不掺杂和依赖业务线特有的业务信息

3. 底层基础组件和业务组件之间的依赖关系:

1. 底层基础组件和业务组件,应该是业务组件对基础组件的单向依赖关系,底层基础组件严禁依赖业务组件
2. 业务组件之间可以存在依赖关系,但是当两个业务组件存在相互依赖关系,就应该思考业务组件的拆分力度,即两个业务组件是否可以合并
2. 基础组件可以横向依赖其它基础组件

4. 通用业务组件提供给多个项目使用,但是项目和项目对于同一业务,也存在部分差异,局部差异化的解决:

1. 开放配置项,比如表单页面的保险选项多数情况根据表单Json数据的开关展示,但是特殊业务线的保险选项跟业务线内特有属性绑定,可以将是否展示的配置项开放出去,由外部提供是否展示保险选项
2. 业务线的后台进行包裹处理,将特有的业务线属性配置到Json模板内去